﻿#ifndef __IAnimationDB_H__
#define __IAnimationDB_H__
#include <lampe/types.h>
#include <lampe/IReferenceCounted.h>
#include "IAnimation.h"

namespace lampe{
namespace animation{

/***
 * @class IAnimationDB
 * Хранит все группы анимаций
 */
class IAnimationDB:public virtual irr::IReferenceCounted{
public:
	/***
	* Добовляет группу анимаций в БД анимаций
	*
	* @param animation группа анмаций, которую нужно добавить в БД анимаций
	* @return номер добавленной группы анимаций
	* */
	virtual u32 addAnimation(IAnimation*animation)=0;
	
	/***
	* Добовляет группу анимаций в БД анимаций
	*
	* @param animation группа анмаций, которую нужно добавить в БД анимаций
	* @return номер добавленной группы анимаций
	* */
    virtual u32 addAnimation(lampe::String animation_name)=0;
	
	/***
	* Удаляет группу анимаций из БД анимаций по её номеру
	*
	* @param index номер группы анимаций, которую нужно удалить
	* */
	virtual void removeAnimationByIndex(u32 index)=0;
	
	/***
	* Удаляет группу анимайи из БД анимаций по её имяни
	*
	* @param name имя группы анимаций
	* */
    virtual void removeAnimationByName(lampe::String name)=0;
	
	/***
	* Ищет номер группы анимаций по её имяни и возвращяет его
	*
	* @param name
	* @return номер анимации с имянем name. Если не найдено, то вернёт -1
	* */
    virtual s32 indexOfByName(lampe::String name)=0;
	
	/***
	* Ищет номер группы анимаций по объекту анимации и возвращяет его
	*
	* @param animation объект анимации, номер которой нужно найти
	* @return номер группы анимаций в списке БД. Если не найдено, то венёт NULL
	* */
	virtual s32 indexOfAnimation(IAnimation*animation)=0;
	
	/***
	* Возвращяет группу анимаций по её номеру
	*
	* @param index номер группы анимаций
	* @return анимация с номером index. Если не найдена, то вернёт NULL
	* */
	virtual IAnimation*getByIndex(u32 index)=0;
	
	/***
	* Возвращяет группу анимаций по её имяни
	*
	* @param name имя группы анимаций
	* @return анимация с имянем name. Если не найдена, то вернёт NULL
	* */
    virtual IAnimation*getByName(lampe::String name)=0;
	
	/***
	* Применяет указанную анимацию к модели. Может работать медленно,
	* потому что при каждом вызове нужная анимация ищется заново.
	* Возможно лучше было бы получить указатели на нужные анимации
	* и вызывать их напрямую
	*
	* @param group имя группы анимаций
	* @param name название анимации
	* @param node узел, к которому нужно применить анимацию
	* */
    virtual void useFor(lampe::String group,lampe::String name,irr::scene::IAnimatedMeshSceneNode*node)=0;
};

extern void setDefaultAnimationDB(IAnimationDB*db);
extern IAnimationDB*getDefaultAnimationDB();

}//namespace animation
}//namespace lampe
#endif
